package com.wjerp.tplus.server.domain.service;

import com.wjerp.tplus.server.api.request.AddInvoiceInfoRequest;
import com.wjerp.tplus.server.api.request.QueryInvoiceListRequest;
import com.wjerp.tplus.server.api.response.InvoiceInfoResponse;
import com.wjerp.tplus.server.common.exception.BusinessException;
import com.wjerp.tplus.server.common.exception.ServiceException;
import com.wjerp.tplus.server.common.model.InvoiceCheckResponse;
import com.wjerp.tplus.server.domain.entity.invoice.mng.InvoiceInfo;

import java.util.List;

/**
 * 发票信息服务接口
 * @author lishuailei
 */
public interface InvoiceInfoService {
    /**
     * 新增发票信息
     * @param request 发票信息入参
     * @param displayUserId 当前录入人员编码
     * @throws BusinessException 异常信息
     * @return
     */
    InvoiceInfoResponse addInvoiceInfo(AddInvoiceInfoRequest request, String displayUserId) throws BusinessException, ServiceException;


    /**
     * 新增发票信息
     * @param request 发票信息入参
     * @param displayUserId 当前录入人员编码
     * @param isAsync 是否异步
     * @throws BusinessException 异常信息
     * @return
     */
    InvoiceInfoResponse addInvoiceInfo(AddInvoiceInfoRequest request, String displayUserId, boolean isAsync) throws BusinessException, ServiceException;


    /**
     * 根据查询条件获取发票信息列表
     * @param request 入参信息
     * @return 发票信息列表
     */
    List<InvoiceInfo> loadInvoiceInfoList(QueryInvoiceListRequest request);

    /**
     * 根据查询条件获取符合条件的发票信息记录数
     * @param request 入参信息
     * @return 发票信息列表总数
     */
    Integer loadInvoiceInfoListCount(QueryInvoiceListRequest request);


    /**
     * 根据发票唯一编码获取发票信息
     * @param invoiceUuidCode 发票唯一编码
     * @return 发票信息
     */
    InvoiceCheckResponse loadInvoiceContentInfoByInvoiceUuidCode(String invoiceUuidCode);

    /**
     * 根据发票唯一编码获取发票信息
     * @param invoiceUuidCode 发票唯一编码
     * @return 发票信息
     */
    InvoiceInfo loadInvoiceInfoByInvoiceUuidCode(String invoiceUuidCode);

    /**
     * 根据发票唯一编码删除发票信息（逻辑删除）
     * @param invoiceUuidCode 发票唯一编码
     * @param displayUserId 操作用户ID
     */
    void deleteInvoiceByCode(String invoiceUuidCode, String displayUserId) throws ServiceException;

    /**
     * 重新查验发票
     * @param invoiceUuidCode 乏味唯一编码
     * @param displayUserId 操作用户ID
     * @param companyCode 公司编码
     */
    void reVerInvoice(String invoiceUuidCode, String companyCode, String displayUserId) throws ServiceException;
}
